package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.model.album.BaseAttribute;
import com.atguigu.tingshu.model.album.BaseCategory1;
import com.atguigu.tingshu.model.album.BaseCategoryView;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

	@Autowired
	private BaseCategory1Mapper baseCategory1Mapper;

	@Autowired
	private BaseCategory2Mapper baseCategory2Mapper;

	@Autowired
	private BaseCategory3Mapper baseCategory3Mapper;
	@Autowired
	private BaseCategoryViewMapper baseCategoryViewMapper;

	@Autowired
	private BaseAttributeMapper baseAttributeMapper;


	/**
	 * 查询所有分类（1、2、3级分类）
	 *
	 * @return 业务数据：[{"categoryId":1,"categoryName":"分类",categoryChild:[..]},{其他1级分类}]
	 */
	@Override
	public List<JSONObject> getBaseCategoryList() {

		//1 查询所有分类信息
		List<BaseCategoryView> allCategoryList = baseCategoryViewMapper.selectList(null);
		//2 创建集合用于存贮最终数据
		ArrayList<JSONObject> returnList = new ArrayList<>();
		//3 用Stream流进行分组
		Map<Long, List<BaseCategoryView>> category1Map = allCategoryList.stream()
				.collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
		//4 得到一个包含该map全部键值对的集合，并遍历这个集合，对每一种一级分类进行操作，来构建目标集合
		Set<Map.Entry<Long, List<BaseCategoryView>>> entries1 = category1Map.entrySet();
		for (Map.Entry<Long, List<BaseCategoryView>> entry1 : entries1){
			//4.1 封装当前一级分类对象
			JSONObject jsonObject1 = new JSONObject();
			//获取当前一级分类的id
			Long category1Id = entry1.getKey();
			//将当前一级分类id封装
			jsonObject1.put("categoryId",category1Id);
			//获取当前一级分类的名字
			String category1Name = entry1.getValue().get(0).getCategory1Name();
			jsonObject1.put("categoryName",category1Name);
			//5 获得当前一级分类所包含的二级分类，并将其封装入一级分类对象
			//创建存储二级分类对象的JSONObject数组
			List<JSONObject> jsonObject2List = new ArrayList<>();
			//根据当前一级分类对象用Stream流对二级分类进行分组
			Map<Long, List<BaseCategoryView>> category2Map = entry1.getValue().stream()
					.collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
			//得到一个包含该map全部键值对的集合，并遍历这个集合，对每一种二级分类进行操作，来构建目标集合
			Set<Map.Entry<Long, List<BaseCategoryView>>> entries2 = category2Map.entrySet();
			for (Map.Entry<Long, List<BaseCategoryView>> entry2 : entries2){
				//创建存储当前二级分类的对象
				JSONObject jsonObject2 = new JSONObject();
				//获取当前二级分类的id
				Long category2Id = entry2.getKey();
				//将当前二级分类id封装
				jsonObject2.put("categoryId",category2Id);
				//获取当前一级分类的名字
				String category2Name = entry2.getValue().get(0).getCategory2Name();
				//将当前二级分类的名字封装
				jsonObject2.put("categoryName",category2Name);
				//将当前二级分类对象放入二级对象的集合中
				jsonObject2List.add(jsonObject2);
				//6 获得当前二级分类所包含的三级分类，并将其封装入二级分类对象
				//创建存储三级分类的列表
				ArrayList<JSONObject> jsonObject3List = new ArrayList<>();
				//遍历当前二级分类的集合，构建三级分类数据模型（由于在当前二级分类对象下，每个二级分类id都只对应一条三级分类，所以不需要再分组）
				List<BaseCategoryView> list = entry2.getValue();
				for (BaseCategoryView categoryItem : list){
					//创建三级分类集合中存储当前三级分类的对象
					JSONObject jsonObject3 = new JSONObject();
					Long category3Id = categoryItem.getCategory3Id();
					jsonObject3.put("categoryId",category3Id);
					String category3Name = categoryItem.getCategory3Name();
					jsonObject3.put("categoryName",category3Name);
					//将当前三级分类对象放入三级分类集合
					jsonObject3List.add(jsonObject3);

				}
				jsonObject2.put("categoryChild",jsonObject3List);

			}
			//将当前二级分类的列表封装入当前一级分类对象，当前一级分类对象的数据模型构建完成
			jsonObject1.put("categoryChild",jsonObject2List);
			//将构建好的一级分类对象放入一级分类的集合中
			returnList.add(jsonObject1);
		}
		//返回构建好的数据模型
		return returnList;
	}

	/**
	 * 根据一级分类Id获取分类属性以及属性值（标签名，标签值）列表
	 *
	 * @param category1Id
	 * @return
	 */

	@Override
	public List<BaseAttribute> getAttributesByCategory1Id(Long category1Id) {
		return baseAttributeMapper.getAttributesByCategory1Id(category1Id);
	}
}
